home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_pcdp / ada / rwmon.ada < prev    next >
Text File  |  1996-01-30  |  1KB  |  62 lines

  1. package RW_Monitor is
  2.  
  3.   procedure Start_Read;
  4.   procedure Stop_Read;
  5.   procedure Start_Write;
  6.   procedure Stop_Write;
  7.  
  8. end RW_Monitor;
  9.  
  10. with Monitor_Package; use Monitor_Package;
  11. package body RW_Monitor is
  12.  
  13.   OK_to_Read, OK_to_Write: Condition;
  14.  
  15.   Readers: Integer := 0;
  16.   Writing: Boolean := False;
  17.  
  18.   procedure Start_Read is
  19.   begin
  20.     Monitor.Enter;
  21.     if Writing or Non_Empty(OK_to_Write) then
  22.        Monitor.Leave;
  23.        OK_to_Read.Wait;
  24.     end if;
  25.     Readers := Readers + 1;
  26.     OK_to_Read.Signal;
  27.   end Start_Read;
  28.  
  29.   procedure Stop_Read is
  30.   begin
  31.     Monitor.Enter;
  32.     Readers := Readers - 1;
  33.     if Readers = 0 then
  34.        OK_to_Write.Signal;
  35.     else
  36.        Monitor.Leave;
  37.     end if;
  38.   end Stop_Read;
  39.  
  40.   procedure Start_Write is
  41.   begin
  42.     Monitor.Enter;
  43.     if Readers /= 0 or Writing then
  44.        Monitor.Leave;
  45.        OK_to_Write.Wait;
  46.     end if;
  47.     Writing := True;
  48.     Monitor.Leave;
  49.   end Start_Write;
  50.  
  51.   procedure Stop_Write is
  52.   begin
  53.     Monitor.Enter;
  54.     if Non_Empty(OK_to_Read) then
  55.        OK_to_Read.Signal;
  56.     else
  57.        OK_to_Write.Signal;
  58.     end if;
  59.   end Stop_Write;
  60.  
  61. end RW_Monitor;
  62.